2

我正在尝试将文件内容读入任何可读形式。我正在使用 FileInputStream 从文件中读取字节数组,然后尝试将该字节数组转换为字符串。

到目前为止,我已经尝试了 3 种不同的方法:

FileInputStream inputStream = new FileInputStream(file);
byte[] clearTextBytes = new byte[(int) file.length()];
inputStream.read(clearTextBytes);

String s = IOUtils.toString(inputStream); //first way

String str = new String(clearTextBytes, "UTF-8"); //second way

String string = Arrays.toString(clearTextBytes); //third way
String[] byteValue = string.substring(1, string.length() - 1).split(",");
byte[] bytes = new byte[byteValue.length]
for(int i=0, len=bytes.length; i<len; i++){
   bytes[i] = Byte.parseByte(byteValue[i].trim());
}
String newStr = new String(bytes);

当我打印出每个字符串时:1) 什么都不打印,2 & 3) 打印出很多奇怪的字符,例如:PK!�Q���[Content_Types].xml �(���MO� @��&��f��]�<code>��pP<*����v������,_��i�I�(zi�N��}f�</code>��h �5)�&��6Sf����c|�"�d��R�d���Eo�r����l�������:0Tɭ�"Э�p'䧘 ��tn��&� q(=X����!.��,�_�WF�L8W......

我会喜欢关于如何正确地将我的字节数组转换为字符串的任何建议。

4

4 回答 4

4

正如其他人所指出的,数据看起来不包含任何文本,因此很可能是二进制数据,而不是文本。注意以 PKZIP 格式开头的文件,PK并且您的数据的随机性确实表明它可以被压缩。http://www.garykessler.net/library/file_sigs.html 尝试将文件重命名为.ZIP末尾,看看是否可以在文件资源管理器中打开它。

从上面的链接中,DOCX 文件的开头如下所示。

50 4B 03 04 14 00 06 00 PK...... DOCX、PPTX、XLSX

Microsoft Office Open XML Format (OOXML) Document

NOTE: There is no subheader for MS OOXML files as there is with
DOC, PPT, and XLS files. To better understand the format of these files,
rename any OOXML file to have a .ZIP extension and then unZIP the file;
look at the resultant file named [Content_Types].xml to see the content
types. In particular, look for the <Override PartName= tag, where you
will find word, ppt, or xl, respectively.

Trailer: Look for 50 4B 05 06 (PK..) followed by 18 additional bytes
at the end of the file.

假设您有文本数据,很可能字符编码不是您的默认值,也不是 UTF-8。您需要a)检查编码是什么,b)在输出字符串而不是输入时检查损坏不是。

您可以尝试蛮力找到一个不会产生任何未知字符的字符集。

public static Set<Charset> possibleCharsets(byte[] bytes) {
    Set<Charset> charsets = new LinkedHashSet<>();
    for (Charset charset : Charset.availableCharsets().values()) {
        if (!new String(bytes, charset).contains("�"))
            charsets.add(charset);
    }
    return charsets;
}
于 2015-12-01T13:17:19.277 回答
0

UTF8 可以容纳大约 2,097,152 个不同的字符,他们没有图像你看到问号。请尝试使用经典的 dos 代码页:

new String(clearTextBytes, "DOS-US");
于 2015-12-01T13:24:04.947 回答
0

检查此以获取 word 文件的文本内容:您需要Apache POI库。

import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
import org.apache.poi.xwpf.usermodel.XWPFDocument;

[...]

   XWPFDocument docx = new XWPFDocument(new FileInputStream("file.docx"));       
   XWPFWordExtractor we = new XWPFWordExtractor(docx);
   System.out.println(we.getText());
于 2015-12-01T13:24:31.723 回答
0

我编写了一个非常基本的程序来读取文件的内容并将每个字符串打印在控制台的新行上。这是文件的内容:

文件1.txt

这是我写的程序:

import java.io.*;
import java.util.*;

class Test {
    public static void main(String args[]) throws FileNotFoundException {
        File file = new File("File1.txt");
        Scanner input = new Scanner(file);

        while (input.hasNext()) {
            System.out.println(input.next());
        }

        input.close();

    } // main()
} // class Test

这是控制台的输出:

apples
pears
1
2
3
oranges
carrots
bananas
pineapples
于 2015-12-01T13:51:16.920 回答