java - 在文件处理中如何从 char[] 数组读取文件?

标签 java file-handling

这是将一个文件的文本复制到另一个文件的代码。

   public class Writer 
   {
    public static void main(String args[]) throws IOException
    {
      File f=new File("D:/test.txt");
      FileReader fr=new FileReader(f);
      char cbuff[]=new char[(int)f.length()];
      int c=fr.read(cbuff);

     fr.close();

      FileWriter fw=new FileWriter("D:/newTest.txt");
     fw.write(cbuff);
        fw.close();
    }   
    }

我想知道这条线的作用

char cbuff[]=new char[(int)f.length()];

FileReader 如何识别将其读取的文件文本存储到此 cbuff[] 中?
当我评论这一行时

int c=fr.read(cbuff);

代码不起作用。为什么?

最佳答案

好的,首先,这是一个适用于任何文件的代码,而不仅仅是文本文件:

final Path src = Paths.get("D:/test.txt");
final Path dst = Paths.get("D:/newTest.txt");
Files.copy(src, dst);

现在,您的代码已严重损坏。让我们从这个开始:

char cbuff[]=new char[(int)f.length()];

这将创建一个与文件大小相同的char数组;但它没有考虑到 byte<->char 映射不是 1 到 1 的事实。例如,如果文件采用 UTF-8 编码,“à "以两个字节编码;因此,char 数组至少会长一个元素。在 UTF-16(每个 char 是两个 byte)甚至 UTF-32 中情况更糟。

第二个问题:

FileReader fr=new FileReader(f);

未指定编码;使用默认的 JVM 编码。

因此,如果您尝试使用默认 JVM 编码 windows-1252 读取以 UTF-8 编码的文件,您将损坏目标文件

输出文件也是如此:未指定编码。这样的文件本质上是“不可移植的”。

第三个问题:有:

int c=fr.read(cbuff);

这将返回实际读取的字符数;很好。

但是当你写回文件时这并没有被使用!写入代码应该是:

fw.write(cbuff, 0, c);

关于java - 在文件处理中如何从 char[] 数组读取文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22296679/

相关文章:

java - 将 byte[] 转换为字符串时出现问题

Java:如何使两个记录器写入不同的文件(Logger)

c - 如何在C中将文件中的网格读入二维数组?

java - 如何在 Nutch 2.1 solrindex 命令中过滤 URL

java - FasterXML - Jackson XML 扩展将 pojo 中的值转换为 null

java - log4j2 spring boot 查找无法从 application.properties 中读取属性

r - 在 R 中处理 ASCII

java - 在java中打印文本文件引号内的一行

c - 我正在尝试搜索文件计数。使用二分搜索遇到 ‘C’ 个保留字

java - 覆盖接口(interface)方法