【问题标题】:Read String and bytes from the same file java从同一个文件java中读取字符串和字节
【发布时间】:2013-06-18 22:16:25
【问题描述】:

我正在寻找一种在读取字节(如 byte[])和从文件中读取字符串行之间切换的方法。我知道可以通过 FileInputStream 从文件中获取 byte[],并且可以通过 BufferedReader 获取 String,但是同时使用它们是有问题的。我知道字节部分有多长。从我写文件开始,字符串编码就可以保持不变。文件类型是一种仍在开发中的自定义文件类型,因此我可以更改写入数据的方式。

如何在 java 中从同一个文件中读取字符串和字节[]?

【问题讨论】:

  • 总是读取一种类型并在需要时转换?您可以将 String 转换为 byte[] 并将 byte[] 转换为 String。
  • 为什么不将整个文件作为字节数组读取,然后在读取文件后将需要的部分转换为字符串?
  • 使用DataInputStreamDataOutputStream 保持格式一致?

标签: java io java-io


【解决方案1】:

读取为字节。当您读取了您知道应该是字符串的字节序列时,将这些字节放入数组中,将数组放入 ByteArrayInputStream 并将其用作 Reader 的底层 InputStream 以获取字节为字符,然后读取这些字符以生成 String

有关此过程的后续部分,请参阅how to create a String from an InputStream 上的相关 SO 问题。

【讨论】:

    【解决方案2】:

    使用BufferedReader 将文件读取为Strings,然后使用String.getBytes()

    【讨论】:

    • 当你这样做时,编码会弄乱一些原始数据。
    【解决方案3】:

    为什么不试试这个:

            BufferedReader bufferedReader = null;
    
            try {
                bufferedReader = new BufferedReader(new FileReader("testing.txt"));
                String line = bufferedReader.readLine();
                while(line != null){
                    byte[] b = line.getBytes();
                }
    
            } finally {
                if(bufferedReader!=null){
                    bufferedReader.close();
                }
            }
    

                FileInputStream in = null;
            BufferedReader bufferedReader = null;
    
            try {
                bufferedReader = new BufferedReader(new FileReader("xanadu.txt"));
                String line = bufferedReader.readLine();
                while(line != null){
                    //read your line
                }
                in = new FileInputStream("xanadu.txt");
                int c;
                while ((c = in.read()) != -1) {
                    //read your bytes (c)
                }
    
    
            } finally {
                if (in != null) {
                    in.close();
                }
                if(bufferedReader!=null){
                    bufferedReader.close();
                }
            }
    

    【讨论】:

      【解决方案4】:

      从缓冲的输入流中读取所有内容作为字节,并使用constructor that accepts the byte array将字符串部分转换为字符串:

       String string = new String(bytes, offset, length, "US-ASCII"); 
      

      根据数据的实际编码方式,您可能需要使用“UTF-8”或其他名称作为charset 的名称。

      【讨论】:

        猜你喜欢
        • 2012-12-25
        • 1970-01-01
        • 1970-01-01
        • 2010-10-08
        • 2017-09-06
        • 2013-02-28
        • 1970-01-01
        • 2013-05-17
        相关资源
        最近更新 更多