使用ISO-8859-1的Java快速流拷贝

使用ISO-8859-1的Java快速流拷贝,java,iso-8859-1,Java,Iso 8859 1,我有以下代码,将读取ISO-8859-1中的文件,因为这是本应用程序所需的代码 private static String readFile(String filename) throws IOException { String lineSep = System.getProperty("line.separator"); File f = new File(filename); StringBuffer sb = new StringBuffer(); if (f.exists())

我有以下代码,将读取ISO-8859-1中的文件,因为这是本应用程序所需的代码

private static String readFile(String filename) throws IOException {




String lineSep = System.getProperty("line.separator");
File f = new File(filename);
StringBuffer sb = new StringBuffer();
if (f.exists()) {
 BufferedReader br =
 new BufferedReader(
   new InputStreamReader(
              new FileInputStream(filename), "ISO-8859-1"));

 String nextLine = "";
 while ((nextLine = br.readLine()) != null) {
   sb.append(nextLine+ " ");
   // note:  BufferedReader strips the EOL character.
  // sb.append(lineSep);
 }
  br.close();
}

return sb.toString();
}
问题是它相当慢。我有这个功能,速度快得多,但我似乎找不到如何放置字符编码:

private static String fastStreamCopy(String filename)
{
   String s = "";
FileChannel fc = null;
try
{
    fc = new FileInputStream(filename).getChannel();



    MappedByteBuffer byteBuffer = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size());

    int size = byteBuffer.capacity();
    if (size > 0)
        {

            byteBuffer.clear();
            byte[] bytes = new byte[size];
            byteBuffer.get(bytes, 0, bytes.length);
            s = new String(bytes);
        }

        fc.close();
    }
    catch (FileNotFoundException fnfx)
    {

        System.out.println("File not found: " + fnfx);
    }
    catch (IOException iox)
{

    System.out.println("I/O problems: " + iox);
   }
finally
    {
    if (fc != null)
        {
        try
            {
            fc.close();
            }
        catch (IOException ignore)
        {

        }
    }
    }
   return s;
}

任何人都知道我应该把ISO编码放在哪里吗?

从您发布的代码中,您不是试图“复制”流,而是将其读入字符串

您只需提供以下格式的编码:

就我个人而言,我只是将整个方法替换为调用:

如果您使用的是Java6或更早版本,则需要使用Guava字段,而不是(仅在Java7中引入)


但是,使用术语“复制”表明您希望将结果写入其他文件(或流)。如果这是真的,那么您根本不需要关心编码,因为您可以直接处理
字节[]
,避免从发布的代码到
字符串的(不必要的)转换,而不是试图“复制”流,而是将其读入字符串

您只需提供以下格式的编码:

就我个人而言,我只是将整个方法替换为调用:

如果您使用的是Java6或更早版本,则需要使用Guava字段,而不是(仅在Java7中引入)


但是,使用术语“复制”表明您希望将结果写入其他文件(或流)。如果这是真的,那么您根本不需要关心编码,因为您可以直接处理
byte[]
,避免在将字节转换为字符串的
String之间进行(不必要的)转换,例如
s=newstring(bytes,encoding)或反之亦然

将字节转换为字符串,例如
s=新字符串(字节,编码)或反之亦然

有趣。我从来没有用过番石榴图书馆。它比标准的java.io.*库快吗?@recursive9:不,它可能没有明显的快,但我认为它将是完成这项任务的最快方法之一。老实说:如何使用API可能比使用哪种API对性能(在I/O方面)的影响更大。例如,在上面的第一个代码中,您无明显原因地逐行读取文件。这意味着a.)将有更多的方法调用,b.)添加查找行分隔符和为每行创建单独的
String
对象的任务。试着修改上面的代码,每次只需读取尽可能多的字符…很有趣。我从来没有用过番石榴图书馆。它比标准的java.io.*库快吗?@recursive9:不,它可能没有明显的快,但我认为它将是完成这项任务的最快方法之一。老实说:如何使用API可能比使用哪种API对性能(在I/O方面)的影响更大。例如,在上面的第一个代码中,您无明显原因地逐行读取文件。这意味着a.)将有更多的方法调用,b.)添加查找行分隔符和为每行创建单独的
String
对象的任务。尝试修改上面的代码,每次只需读取尽可能多的字符…为什么在标题和方法名称中要提到“流副本”?只涉及一个流。既然您似乎只是在读取所有行,为什么不使用java.nio.file.Files类方法readAllLines(路径路径,字符集cs)?为什么在标题和方法名称中谈论“流副本”?只涉及一个流。既然您似乎只是在读取所有行,为什么不使用java.nio.file.Files类方法readAllLines(Path,Charset cs)?
s = new String(bytes, "ISO-88591-1");
String content = Files.toString(new File(filename), StandardCharsets.ISO_8859_1);