【问题标题】:Splitting strings by newline trouble通过换行麻烦拆分字符串
【发布时间】:2012-07-19 05:50:28
【问题描述】:

我正在读取一个通过套接字发送的文件,然后尝试通过换行符 (\n) 将其拆分,当我读取文件时,我使用的是字节 [] 并将字节数组转换为字符串,以便我可以拆分它。

public String getUserFileData()
{
    try
    {
        byte[] mybytearray = new byte[1024];
        InputStream is = clientSocket.getInputStream();
        int bytesRead = is.read(mybytearray, 0, mybytearray.length);

        is.close();

        return new String(mybytearray);
    }
    catch(IOException e)
    {

    }

    return "";
}

这是用于尝试拆分字符串的代码

public void readUserFile(String userData, Log logger)
{
    String[] data;
    String companyName;

    data = userData.split("\n");

    username = data[0];
    password = data[1].toCharArray();
    companyName = data[2];
    quota = Float.parseFloat(data[3]);

    company = new Company();            
    company.readCompanyFile("C:\\Users\\Chris\\Documents\\NetBeansProjects\\ArFile\\ArFile Clients\\" + companyName + "\\"
            + companyName + ".cmp");

    cloudFiles = new CloudFiles();
    cloudFiles.readCloudFiles(this, logger);
}

导致这个错误

Exception in thread "AWT-EventQueue-1" java.lang.ArrayIndexOutOfBoundsException

【问题讨论】:

  • 你有什么问题/麻烦/问题/疑问???
  • BufferedReader包裹流,有readLine方法。
  • 啊,感谢您的编辑。现在请告诉我们哪一行是这个异常的原因?你的代码真的有空的 catch 块吗?
  • 是的,@nhahtdh 推荐的是正确的方法。他的评论应该是一个答案。 1+
  • @nhahtdh 请将此作为答案并投反对票

标签: java regex sockets netbeans split


【解决方案1】:

您可以在BufferedReader 类中使用readLine 方法。

InputStream 包裹在InputStreamReader 下,并将其包裹在BufferedReader 下:

InputStream is = clientSocket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));

还请检查流的编码 - 您可能需要在 InputStreamReader 的构造函数中指定编码。

【讨论】:

  • 这实际上不是导致我的问题的原因,但我将其标记为答案,因为这样做会更好。我已经解决了我的问题,这只是我的愚蠢
【解决方案2】:

如 cmets 中所述,最好使用 BufferedReader - 无论如何您都应该使用 InputStreamReader 以便从二进制转换为文本。

// Or use a different encoding - whatever's appropriate
BufferedReader reader = new BufferedReader(
    new InputStreamReader(clientSocket.getInputStream(), "UTF-8");
try {
    String line;
    // I'm assuming you want to read every incoming line
    while ((line = reader.readLine()) != null) {
        processLine(line);
    }
} finally {
    reader.close();
}

请注意,说明您要使用哪种编码很重要 - 否则它将使用平台的默认编码,该编码因机器而异,而数据可能采用一种特定编码.如果你还不知道那是哪种编码,你需要找出来。在那之前,您根本无法可靠地理解数据。

(顺便说一句,我希望你的真实代码没有空的 catch 块。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-26
    • 1970-01-01
    • 2020-09-16
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    • 1970-01-01
    • 2016-04-28
    相关资源
    最近更新 更多