2016-11-17 128 views
2

在Java中,如何將整個輸入文件轉換爲一個String如何將整個輸入文件轉換爲字符串?

換句話說,如果我有一個輸入文件"test.in"

c++ 
java 
python 
test 

然後我想創建一個包含"c++javapythontest"一個String

我想的東西沿

Scanner input = new Scanner(new File("test.in")); 
while(input.hasNext()){ 
    String test = test + input.nextLine(); 
} 

行,但似乎並沒有工作。
有沒有一種有效的方法來做到這一點?

+2

試想一下循環的第一次迭代。 'test'是未定義的,那麼要添加什麼呢? –

+0

所以你想放棄所有換行符? – Bohemian

+0

'FileInputStream fis = new FileInputStream(「test.in」); byte [] byteArray = new byte [fis.availble()]; fis.read(字節陣列,0,byteArray.length); String str = new String(byteArray);' –

回答

4

讀取文件內容,丟棄換行字符:

String contents = Files.lines(Paths.get("test.in")).collect(Collectors.joining()); 

我認爲你需要測試hasNextLine(),和你的代碼的表現從創造這麼多的對象患有當您連接喜歡的字符串。如果您將代碼更改爲使用StringBuilder,則運行速度會更快。

1

可能有很多方法來做到這一點。您可以嘗試的方法之一是使用nio程序包類。您可以使用java.nio.file.Files類的readAllBytes方法首先獲得byte array,然後從字節數組new String(bytes)創建一個新的String對象。

閱讀這個方法的Java Doc

以下是一個示例方案:

byte[] bytes= Files.readAllBytes(Paths.get(filePath)); 
String fileContent = new String(bytes); 
0

聲明字符串測試跳出循環,然後循環填充它。

0

此代碼是對原始邏輯的小修改。
StringBuilder創建一個可變的字符序列,這意味着我們只是將內容附加到StringBuilder對象的值,而不是每次創建一個新對象。

在您的代碼String test = test + input.nextLine();是在while循環內。
因此,String測試的新對象是用while循環的每次迭代創建的,因此它不保存以前的值。

String path = "test.txt"; 
Scanner input = new Scanner(new File(path)); 
StringBuilder sb = new StringBuilder(); 

while (input.hasNext()) { 
    sb.append(input.nextLine() + "\n"); 
} 
System.out.println(sb.toString()); 
0

可以代替試試這個。
它的一個簡單的襯墊

String str = new String(Files.readAllBytes(Paths.get("/path/to/file")));

這讀取整個文件,並保持它作爲字符串。
如果你想刪除新的行字符。

str.replace("\n", "");

0

String.joinJava8被加入內部使用StringBuilder

String content = String.join("", Files.readAllLines(Paths.get("test.in")));