Java FileInputStream 问题(额外的空白)

当我使用 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]); 

            } 

        }

    }


}

这是输出循环的结果:

http://img4.sycdn.imooc.com/648928ef0001228809680403.jpg

这是文本文件的图片:

http://img2.sycdn.imooc.com/648928ff00011bd803900449.jpg


拉风的咖菲猫
浏览 188回答 4
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();            }        }            }

炎炎设计

我看过你的代码。似乎通过使用它我已经检测到通过使用 FileInputStream 它将在值之间产生一个空白空间。static char[][] spawnWorld = new char[30][30];public static void main(String[] args) {&nbsp; &nbsp; try {&nbsp; &nbsp; &nbsp; &nbsp; FileInputStream spawn = new FileInputStream("C:/Daniel/spawn.txt");&nbsp; &nbsp; &nbsp; &nbsp; int i = 0;&nbsp; &nbsp; &nbsp; &nbsp; int h = 0;&nbsp; &nbsp; &nbsp; &nbsp; int k = 0;&nbsp; &nbsp; &nbsp; &nbsp; while ((i = spawn.read()) != -1) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (h == 30) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; h = 0;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; k++;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; spawnWorld[k][h] = (char) i;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (h == 19) System.out.println((char) i);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("[" + k + "][" + h + "] : " +&nbsp; i);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; h++;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; spawn.close();&nbsp; &nbsp; } catch (Exception e) {&nbsp; &nbsp; &nbsp; &nbsp; e.printStackTrace();&nbsp; &nbsp; }&nbsp; &nbsp; System.out.println("Start Printing");&nbsp; &nbsp; for (int i = 0; i < 30; i++) {&nbsp; &nbsp; &nbsp; &nbsp; for (int j = 0; j < 30; j++) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("[" + i + "][" + j + "] : " + spawnWorld[i][j]);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; System.exit(0);}从那时起,您可以相应地调试它。在第 19 行,您的“i”返回一个空格或字符值 i。我建议改用扫描仪作为读取文件的方式。

月关宝盒

将System.out.println循环内部更改为 just System.out.print。System.out.println每次都会自动添加一个换行符,即使你只打印一个字符。 System.out.print将接受String您传入的内容,并按原样打印。此外,除非是故意的,否则请确认您没有\n在每行末尾打印(换行符)。如果你真的想在每一行的末尾开始一个新行,只需System.out.println();在最内层循环结束后放一行。

皈依舞

文本文件由一行中的字符组成,后跟行尾序列,通常是换行符或回车符后跟换行符。(这些也可以被认为是行分隔符而不是行尾,最后一行可能不会跟一个,这取决于文件的创建方式。)您正在逐个字符地读取文件,但您没有考虑这些行尾字符。FileInputStream使用or没有任何区别Scanner;问题是,您一次读取文件一个字符,但不考虑回车和换行符。例如:while ((i=spawn.read()) != -1) {&nbsp; &nbsp; if (Character.isWhitespace((char)i)) {&nbsp; &nbsp; &nbsp; &nbsp; continue;&nbsp; &nbsp; }&nbsp; &nbsp; if (h == 30) {&nbsp; &nbsp; &nbsp; &nbsp; h = 0;&nbsp; &nbsp; &nbsp; &nbsp; k++;&nbsp; &nbsp; }&nbsp; &nbsp; spawnWorld[k][h] = (char)i;&nbsp; &nbsp; h++;}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java