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

他の人が指摘したように、データにはテキストが含まれているようには見えないため、テキストではなくバイナリデータである可能性が非常に高くなります。で始まるファイルPKは PKZIP 形式である可能性があり、データのランダム性から、圧縮されている可能性があることに注意してください。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

ファイルの内容を読み取り、各文字列をコンソールの新しい行に出力するための非常に基本的なプログラムを作成しました。ファイルの内容は次のとおりです。

File1.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 に答える
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 に答える