- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试从文本文件中提取特定数据。我使用 bufferreader 逐行读取文件,以便我可以处理该行。
以下是我编写的代码:
File CAD = new File (filename);
try (FileReader fileReader = new FileReader(CAD))
{
String bn = CAD.getName();
String[] bn2 = bn.split("\\.");
BOARD_NAME= bn2[0];
StringBuilder PACKAGE = new StringBuilder(),
GRAPHIC = new StringBuilder(),
PADS_DIA = new StringBuilder(),
PADS = new StringBuilder(),
COMPONENTS = new StringBuilder();
try (BufferedReader bufferedReader = new BufferedReader(fileReader))
{
String line;
while ((line = bufferedReader.readLine()) != null)
{
if (line.startsWith("J!"))
{
String[] units = line.split("!");
UNITS = units[8];
}
else if (line.startsWith("A!REFDES!COMP_CLASS!"))
{
while (!"A!NET_NAME!REFDES!PIN_NUMBER!PIN_NAME!PIN_GROUND!PIN_POWER!".equals(line = bufferedReader.readLine()))
{
if (line.startsWith("S!"))
{
String[] data = line.split("!");
COMPONENTS.append(data[1])
.append("!")
.append(data[8])
.append("!")
.append(data[10])
.append("!")
.append(data[11])
.append("!")
.append(data[12])
.append("\n");
}
}
}
else if (line.startsWith("A!PAD_NAME"))
{
do
{
if (line.startsWith("S!") && line.contains("00001"))
{
String[] data = line.split("!");
if ("CIRCLE".equals(data[6]))
{
PADS.append(data[1])
.append("!C!")
.append(data[7])
.append("!")
.append(data[8])
.append("!TOP")
.append("\n");
}
else if (data[6].equals(""))
{
PADS.append(data[1])
.append("!0!")
.append(data[7])
.append("!")
.append(data[8])
.append("!TOP")
.append("\n");
}
else
{
PADS.append(data[1])
.append("!R!")
.append(data[7])
.append("!")
.append(data[8])
.append("!TOP")
.append("\n");
}
}
else if (line.startsWith("S!") && line.contains("BOTTOM"))
{
String[] data = line.split("!");
if ("CIRCLE".equals(data[6]))
{
PADS.append(data[1])
.append("!C!")
.append(data[7])
.append("!")
.append(data[8])
.append("!BOTTOM")
.append("\n");
}
else if (data[6].equals(""))
{
PADS.append(data[1])
.append("!0!")
.append(data[7])
.append("!")
.append(data[8])
.append("!BOTTOM")
.append("\n");
}
else
{
PADS.append(data[1])
.append("!R!")
.append(data[7])
.append("!")
.append(data[8])
.append("!BOTTOM")
.append("\n");
}
}
else if (line.startsWith("S!") && line.contains("~DRILL"))
{
String[] data = line.split("!");
PADS_DIA.append(data[1])
.append("!")
.append(data[6])
.append("\n");
}
}while (!"A!GRAPHIC_DATA_NAME!GRAPHIC_DATA_NUMBER!RECORD_TAG!GRAPHIC_DATA_1!GRAPHIC_DATA_2!GRAPHIC_DATA_3!GRAPHIC_DATA_4!GRAPHIC_DATA_5!GRAPHIC_DATA_6!GRAPHIC_DATA_7!GRAPHIC_DATA_8!GRAPHIC_DATA_9!SUBCLASS!SYM_NAME!REFDES!".equals(line = bufferedReader.readLine()));
}
if (line.startsWith("A!SYM_NAME!"))
{
int k =0,j=0;
String[] data1 = line.split("!");
for (int i =0; i<data1.length;i++)
{
if (data1[i].equals("PIN_NUMBER"))
{
k=i;
}
else if (data1[i].equals("PIN_ROTATION"))
{
j=i;
}
}
while(!"A!VIA_X!VIA_Y!PAD_STACK_NAME!NET_NAME!TEST_POINT!".equals(line = bufferedReader.readLine()))
{
if (line.startsWith("S!"))
{
String[] data = line.split("!");
if (data[8].equals("")||data[8]==null)
{}
else
{
PACKAGE.append(data[1])
.append("!")
.append(data[k])
.append("!")
.append(data[k+1])
.append("!")
.append(data[k+2])
.append("!")
.append(data[k+3])
.append("!")
.append(data[k+4])
.append("!")
.append(data[j])
.append("\n");
}
}
}
}
else if (line.startsWith("A!CLASS!SUBCLASS!GRAPHIC_DATA_NAME!"))
{
while (!"A!SUBCLASS!PAD_SHAPE_NAME!GRAPHIC_DATA_NAME!GRAPHIC_DATA_NUMBER!RECORD_TAG!GRAPHIC_DATA_1!GRAPHIC_DATA_2!GRAPHIC_DATA_3!GRAPHIC_DATA_4!GRAPHIC_DATA_5!GRAPHIC_DATA_6!GRAPHIC_DATA_7!GRAPHIC_DATA_8!GRAPHIC_DATA_9!PAD_STACK_NAME!REFDES!PIN_NUMBER!".equals(line = bufferedReader.readLine()))
{
if (line.startsWith("S!BOARD GEOMETRY!OUTLINE"))
{
//to find the diamension x and y of board
String data[]=line.split("!");
double valuex = Double.parseDouble(data[6]);
double valuey = Double.parseDouble(data[7]);
PANEL_X.add(valuex);
PANEL_Y.add(valuey);
}
else if (line.startsWith("S!REF DES"))
{
String data[] = line.split("!");
if (data[2].equals("ASSEMBLY_TOP")||data[2].equals("DISPLAY_TOP"))
{
GRAPHIC.append(data[12])
.append("!")
.append("TOP")
.append("\n");
}
else if(data[2].equals("ASSEMBLY_BOTTOM")||data[2].equals("DISPLAY_BOTTOM"))
{
GRAPHIC.append(data[12])
.append("!")
.append("BOTTOM")
.append("\n");
}
}
}
double max_x = max(PANEL_X);
double min_x = min(PANEL_X);
double max_y = max(PANEL_Y);
double min_y = min(PANEL_Y);
double diamensionx = max_x - min_x;
double diamensiony = max_y - min_y;
MIN_X = min_x;
MIN_Y = min_y;
BOARD_X = diamensionx;
BOARD_Y = diamensiony;
BOARD_Z = 62.9921;
}
ArrayList<String> $TEMP_LIST = new ArrayList<>(asList(GRAPHIC.toString().split("\n")));
HashSet<String> graphic = new HashSet<>($TEMP_LIST);
GRAPHIC_LIST = new ArrayList<>(graphic);
PACKAGE_LIST = new ArrayList<>(asList(PACKAGE.toString().split("\n")));
PADS_LIST = new ArrayList<>(asList(PADS.toString().split("\n")));
PADS_DIA_LIST = new ArrayList<>(asList(PADS_DIA.toString().split("\n")));
COMPONENTS_LIST = new ArrayList<>(asList(COMPONENTS.toString().split("\n")));
}
}
fileReader.close();
}
在我的代码中,仍然有许多 if else
条件。当我尝试从大约 20MB 的文件中提取时,需要大约 30 秒的时间。但是当我尝试读取大约 200MB 大小的文件时,需要很长的时间,比如 30 多分钟。我的 friend 建议我使用 MappedByteBuffer
来处理得更快。
我还是 Java 新手。那么在这种情况下,MappedBuffer
的执行速度比 BufferReader
更快吗?如果是,我该如何逐行处理数据?
最佳答案
我怀疑您的问题出在 BufferedReader
上,它的速度足以满足几乎所有用途。使用 MappedByteBuffer 确实允许您一次性将文件的内容(或部分内容)读入内存,但是您处理的是 ByteBuffer 而不是行文本,并且您不太可能通过它获得显着的性能改进。
如果你删除 while 循环的内容,只读取这些行而不进行任何处理,你会发现瞬间读取了 20MB 的文件。
一个明显的(较小的)改进是将 line.split("!")
移至实际需要的范围。我不确定您显示的代码是否是您的实际代码(可能不是因为您将 split()
拼写为 splits()
,但在示例代码中您仅当以 cga
开头时才需要分割该行。在没有看到实际代码的情况下,很难指出所有导致速度变慢的位置(当然,您可以使用探查器)。
最后一个建议,如果您专业编写 Java,您可能希望避免非 Java 内容,例如变量名中的 $
以及在自己的行上打开大括号(Java 遵循 1TBS )。这对可能阅读您的代码的其他 Java 开发人员很有帮助。
关于java - MapByteBuffer 比 BufferReader 更快吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32881246/
我有一个可以将某些字符加粗的函数。一切工作正常,除了我在方法开始时的字符串被剪切到某处并返回一半,而不是作为开始时得到的整个字符串。这是代码,我不知道我的错误在哪里。 public String bo
我正在从输入(IDE eclipse Luna)输入行,按下回车键,光标一直向下移动,但没有输出显示。在尝试的第二种方法中,但我必须按两次 enter 才能打印输出,我该如何修复这两个错误。为什么在第
我有一个有点简单的服务器,这意味着我正在尝试通过使服务器尽可能面向对象来学习不同的设计模式。令人惊讶的是,在我创建方法 close() 之前我还没有遇到过一个问题。 很明显,当客户端关闭与数据库的连接
我正在尝试使用 BufferReader 填充二维数组,它成功填充了数组的所有行,除了最后一行之外。我尝试将循环增加一以解决该行,但出现索引越界错误。我怎样才能显示最后一行? public stati
我有这个简单的方法: private String read(String filePath) throws IOException { FileReader fileReader = new
我有一个问题正在解决。我必须使用 bufferedReader 将单词添加到树集中(并输出树集的大小),但问题是我无法通过编译器速度测试限制。文本仅包含字母和空格(可以是空行)。我必须找到一个新的解决
我使用 while 循环逐行搜索文件中的内容,直到找到字符串“MATCH”。但是当在另一个函数中我需要再次使用 BufferReader 时,它会引用文件末尾还是从文件开头开始? Public Str
我正在尝试处理我用 BufferReader 读取的 html,如下所示: try { HttpResponse response = DisplayMessageAc
是否可以为缓冲区读取器设置多个标记,以便我可以多次预读? 所以我的代码比较长,但基本思路是在设置一个我将要返回的标记之后,我提前阅读。我的代码检查此“前面”行是否满足某些条件,如果满足,它会在返回初始
全部,我正在尝试读取一个将由多个线程写入的文件,我将使用 BufferedReader 在一个线程中读取该文件。 代码如下所示。 FileReader reader = new FileReader(
java BufferReader 有一个方法 readLine 读取到 '\n' 或 '\r' 是读取然后返回行字符串。示例: InputStreamReader isr = new InputSt
使用以下代码将读取器的输出拆分为字符串,然后在构造函数中使用这些字符串。但是,当 bufferreader 到达流的末尾时,它会输出 null,这会导致构造函数中出现空指针异常。 List resul
我可以看到以下两个程序之间的性能差异巨大。 import java.io.*; import java.util.Date; class SkipProg2 { public static vo
我正在使用 java 中的 HttpURLConnection 读取一个大型 xml 文件,如下所示。 StringBuilder responseBuilder = new StringBuilde
I wrote some program that has to receive and send messages. But I have some troubles with streams
我正在尝试从文本文件中提取特定数据。我使用 bufferreader 逐行读取文件,以便我可以处理该行。 以下是我编写的代码: File CAD = new File (filename);
我正在制作一个 HTTP 服务器和 HTTP Web 客户端,用于简单的 Http 请求和响应。 这是服务器的代码 import java.io.*; import java.net.*; impor
如何使用 FileReader 而不是使用 BufferReader 我想将 File,FileReader 用于此从 ftp 读取文件的程序 public class FileReader
我是java新手,我尝试用TCP Socket编写一个简单的客户端服务器,但经过几天的努力后我遇到了麻烦,我无法解决这个问题。 我使用 BufferReader.Readline(); 得到 null
我正在制作一个游戏,直到用户在命令行中输入退出为止。 用户可以输入不同的命令,例如 get 和 go,使用 get 命令,用户可以说出想要什么,获取棒球棒。我在代码中所做的就是拆分命令。 一切工作正常
我是一名优秀的程序员,十分优秀!