为了账号安全,请及时绑定邮箱和手机立即绑定

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在每行末尾打印(换行符)。如果你真的想在每一行的末尾开始一个新行,只需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 关注
  • 187 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信