亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java FileInputStream 問題(額外的空白)

Java FileInputStream 問題(額外的空白)

拉風的咖菲貓 2023-06-14 10:41:30
當我使用 FileInputStream 從我的 spawn.txt 文件中為基于圖塊的地圖輸入文本時,它會在每行之間添加額外的空白。package mapInit;import java.io.FileInputStream;public class SpawnMap {? ? static char[][] spawnWorld = new char[30][30];? ? public static void main(String[] args) {? ? ? ? try {? ? ? ? ? ? FileInputStream spawn = new FileInputStream("Resources/Map/spawn.txt");? ? ? ? ? ? int i = 0;? ? ? ? ? ? int h = 0;? ? ? ? ? ? int k = 0;? ? ? ? ? ? while((i=spawn.read())!=-1){? ? ? ? ? ? ? ? if(h == 30) {? ? ? ? ? ? ? ? ? ? h = 0;? ? ? ? ? ? ? ? ? ? k++;? ? ? ? ? ? ? ? }? ? ? ? ? ? ? ? spawnWorld[k][h] = (char)i;? ? ? ? ? ? ? ? h++;? ? ? ? ? ? }? ? ? ?? ? ? ? ? ? spawn.close();? ? ? ? } catch (Exception e) {? ? ? ? }? ? ? ? for (int i=0; i<30; i++) {?? ? ? ? ? ? for (int j=0;j<30;j++) {?? ? ? ? ? ? ? ? System.out.println(spawnWorld[i][j]);?? ? ? ? ? ? }?? ? ? ? }? ? }}這是輸出循環的結果:這是文本文件的圖片:
查看完整描述

4 回答

?
絕地無雙

TA貢獻1946條經驗 獲得超4個贊

我認為Scannerclass 它更適合你的任務

Java 中的掃描器類位于 java.util 包中。Java 提供了多種讀取鍵盤輸入的方法,java.util.Scanner 類就是其中之一。

Java Scanner 類使用默認為空白的定界符將輸入分解為標記。它提供了許多方法來讀取和解析各種原始值。

Java Scanner 類廣泛用于使用正則表達式解析字符串和原始類型的文本。這是在 Java 中獲取輸入的最簡單方法。借助 Java 中的 Scanner,我們可以從用戶那里獲取原始類型的輸入,例如 int、long、double、byte、float、short 等。

Java Scanner 類擴展了 Object 類并實現了 Iterator 和 Closeable 接口。

Java Scanner類提供nextXXX()方法返回值的類型,如nextInt()、nextByte()、nextShort()、next()、nextLine()、nextDouble()、nextFloat()、nextBoolean()等. 要從掃描儀獲取單個字符,可以調用返回單個字符的 next().charAt(0) 方法。?

掃描器 Java 文檔

public static void main(String arg[]) {


? ? try (Scanner sc = new Scanner(new File("Resources/Map/spawn.txt"))) {

? ? ? ? // Checking if sc has another token in the file

? ? ? ? while(sc.hasNext()) {

? ? ? ? ? ? // Print line

? ? ? ? ? ? System.out.println(sc.next());

? ? ? ? }


? ? } catch (Exception ex) {

? ? ? ? // Use a Logger to log exceptions in real projects

? ? ? ? ex.printStackTrace();

? ? }

}

您也可以使用Apache Commons IO庫


? ? ? <dependency>

? ? ? ? <groupId>commons-io</groupId>

? ? ? ? <artifactId>commons-io</artifactId>

? ? ? ? <version>2.5</version>

? ? ? </dependency>



? ? import org.apache.commons.io.FileUtils;

? ? import java.io.File;

? ? import java.io.IOException;

? ? import java.util.List;


? ? public class ReadTextFile {


? ? ? ? public static void main(String[] args) throws IOException {


? ? ? ? ? ? try {? ? ? ?

? ? ? ? ? ? ? ? File f = new File("Resources/Map/spawn.txt");


? ? ? ? ? ? ? ? List<String> lines = FileUtils.readLines(f, "UTF-8");


? ? ? ? ? ? ? ? for (String line : lines) {

? ? ? ? ? ? ? ? ? ? System.out.println(line);

? ? ? ? ? ? ? ? }


? ? ? ? ? ? } catch (IOException e) {

? ? ? ? ? ? ? ? // Use a Logger to log exceptions in real projects

? ? ? ? ? ? ? ? e.printStackTrace();

? ? ? ? ? ? }


? ? ? ? }? ? ? ??

? ? }


查看完整回答
反對 回復 2023-06-14
?
炎炎設計

TA貢獻1808條經驗 獲得超4個贊

我看過你的代碼。似乎通過使用它我已經檢測到通過使用 FileInputStream 它將在值之間產生一個空白空間。


static char[][] spawnWorld = new char[30][30];


public static void main(String[] args) {

    try {

        FileInputStream spawn = new FileInputStream("C:/Daniel/spawn.txt");

        int i = 0;

        int h = 0;

        int k = 0;

        while ((i = spawn.read()) != -1) {

            if (h == 30) {

                h = 0;

                k++;

            }

            spawnWorld[k][h] = (char) i;

            if (h == 19) System.out.println((char) i);

            System.out.println("[" + k + "][" + h + "] : " +  i);

            h++;

        }

        spawn.close();

    } catch (Exception e) {

        e.printStackTrace();

    }


    System.out.println("Start Printing");

    for (int i = 0; i < 30; i++) {

        for (int j = 0; j < 30; j++) {

            System.out.println("[" + i + "][" + j + "] : " + spawnWorld[i][j]);

        }

    }


    System.exit(0);

}

從那時起,您可以相應地調試它。在第 19 行,您的“i”返回一個空格或字符值 i。我建議改用掃描儀作為讀取文件的方式。


查看完整回答
反對 回復 2023-06-14
?
月關寶盒

TA貢獻1772條經驗 獲得超5個贊

System.out.println循環內部更改為 just?System.out.print。

System.out.println每次都會自動添加一個換行符,即使你只打印一個字符。?System.out.print將接受String您傳入的內容,并按原樣打印。

此外,除非是故意的,否則請確認您沒有\n在每行末尾打?。〒Q行符)。如果你真的想在每一行的末尾開始一個新行,只需System.out.println();在最內層循環結束后放一行。


查看完整回答
反對 回復 2023-06-14
?
皈依舞

TA貢獻1851條經驗 獲得超3個贊

文本文件由一行中的字符組成,后跟行尾序列,通常是換行符或回車符后跟換行符。(這些也可以被認為是行分隔符而不是行尾,最后一行可能不會跟一個,這取決于文件的創建方式。)您正在逐個字符地讀取文件,但您沒有考慮這些行尾字符。


FileInputStream使用or沒有任何區別Scanner;問題是,您一次讀取文件一個字符,但不考慮回車和換行符。


例如:


while ((i=spawn.read()) != -1) {

    if (Character.isWhitespace((char)i)) {

        continue;

    }

    if (h == 30) {

        h = 0;

        k++;

    }

    spawnWorld[k][h] = (char)i;

    h++;

}


查看完整回答
反對 回復 2023-06-14
  • 4 回答
  • 0 關注
  • 222 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號