我正在用java编写一个小应用程序
我读了各种大小的文本文件,我需要逐行读取它们(并将行插入数组).
是否有差异BufferedReader.ReadLine(),并RandomAccessFile.ReadLine()在性能方面?
有没有理由更喜欢其中一个?
对于在学校的作业我被要求创建一个简单的程序,创建1000个文本文件,每个文件具有随机数量的行,通过多线程\单个进程计算有多少行.而不是删除那些文件.
现在测试过程中发生了一件奇怪的事情 - 所有文件的线性计数总是比以多线程方式计算它们要快一点,这已经激发了我课堂圈内的学术理论化课程.
当Scanner用于读取所有文件时,一切都按预期工作 - 在500毫秒线性时间和400毫秒线程时间读取1000个文件
然而,当我使用BufferedReader时间下降到大约110ms线性和130ms线程.
哪部分代码会导致这个瓶颈?为什么?
编辑:只是为了澄清,我不是问为什么Scanner工作慢于BufferedReader.
完整的可编译代码:(虽然你应该改变文件创建路径输出)
import java.io.*;
import java.util.Random;
import java.util.Scanner;
/**
* Builds text files with random amount of lines and counts them with
* one process or multi-threading.
* @author Hazir
*/// CLASS MATALA_4A START:
public class Matala_4A {
/* Finals: */
private static final String MSG = "Hello World";
/* Privates: */
private static int count;
private static Random rand;
/* Private Methods: …Run Code Online (Sandbox Code Playgroud) 我有一些来自不同文件的数据流。它的格式如下:
Stream<String> linesModifiedAndAppendedFromVariousFiles=getLines();
Run Code Online (Sandbox Code Playgroud)
但是,我需要将其提供给接受 InputStream 或 Reader 作为参数的库方法。
如何将此 Java 8 流馈送到 InputStream 或某种类型的 Reader 中?
PS:这不是关于将 java.util.streams.Stream 包装在 InputStream 周围。我正在寻找的是相反的方式。
我试图通过URLConnection获取整个WebPage.
最有效的方法是什么?
我已经这样做了:
URL url = new URL("http://www.google.com/");
URLConnection connection;
connection = url.openConnection();
InputStream in = connection.getInputStream();
BufferedReader bf = new BufferedReader(new InputStreamReader(in));
StringBuffer html = new StringBuffer();
String line = bf.readLine();
while(line!=null){
html.append(line);
line = bf.readLine();
}
bf.close();
Run Code Online (Sandbox Code Playgroud)
html包含整个HTML页面.
我有套接字已经声明套接字像这样:
serverAddr = InetAddress.getByName(this.ip);
socket = new Socket(serverAddr, port);
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
Run Code Online (Sandbox Code Playgroud)
但是,以下不起作用.in.ready()总是返回false,如果删除,程序将冻结String message = in.readLine();
private void receive() {
try {
InputStreamReader isr = new InputStreamReader(socket.getInputStream());
System.out.println(isr.getEncoding());
BufferedReader in = new BufferedReader(isr);
if (in.ready()) {
String message = in.readLine();
if (message != null) {
if (listener != null) {
listener.receiveMessage(ip, message);
} else {
print("Client recieved: " + message);//
}
}
}
in.close();
} catch (Exception e) {
print("Error with input stream: …Run Code Online (Sandbox Code Playgroud) 我有一个文本文件,每行一个整数 -
10
20
50
Run Code Online (Sandbox Code Playgroud)
我想阅读和打印这些数字两次甚至多次.我尝试了一些代码而失败了.如何更改代码以打印列表两次?
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.InputStreamReader;
public class DoubleBuffer {
public static void main(String[] args) {
try {
FileInputStream fstream = new FileInputStream("c:/files/numbers.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
String strLine;
// Read rows
while ((strLine = br.readLine()) != null) {
System.out.println(strLine);
}
// Read rows again
while ((strLine = br.readLine()) != null) {
System.out.println(strLine);
}
in.close();
} catch (Exception e) {
System.err.println("Error: " + e.getMessage());
}//try-catch
}// main
}// class
Run Code Online (Sandbox Code Playgroud) 我正在创建一个日志,我想读取log.txt文件的最后一行,但是一旦读完最后一行,我就无法让BufferedReader停止.
这是我的代码:
try {
String sCurrentLine;
br = new BufferedReader(new FileReader("C:\\testing.txt"));
while ((sCurrentLine = br.readLine()) != null) {
System.out.println(sCurrentLine);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null)br.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud) 我想通过推送和拉动异步发送/接收从一个端点到另一个端点(peer2peer)的连续数据流
因此,为了首先解决通信,我开始使用jax-ws soap绑定webservice,因为它有一个端点和推送机制的ws-addressing,但它似乎是很多开销(根据文档很重,因为不熟悉ws-*,我没有实现它,因为我需要多个客户端稍后监听流,并且流是24/7我想要线程可管理的套接字).
然后我拿了jax-rs但它不包含ws-addressing.(jax-rs 2.0)我也查看了websockets但它需要一个app服务器但是我想要一个jvm可支持的代码
所以,现在我正在尝试使用基本套接字,但我遇到的问题是通过服务器上的套接字流式传输数据,客户端不断接收它.这是第一次阅读,但没有进一步.其次,我怎样才能使它异步?
public class sSocket {
public static void main(String args[]) throws IOException{
int i = 15000;
ServerSocket ss;
Socket socket = null;
ss = new ServerSocket(i);
try
{
socket = ss.accept();
socket.setKeepAlive(true);
int iii = 0;
System.out.println("New connection accepted " + socket.getInetAddress() + ":" + socket.getPort());
BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedWriter output = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
while(iii<9)
{
Thread.sleep(2000);
output.write("good" + iii + "\n");
//System.out.print(input.readLine().toString());
output.flush();
iii++;
}
//socket.close();
}
catch(IOException e)
{ …Run Code Online (Sandbox Code Playgroud) 问题:我想从HDFS读取文件的一部分并将其返回,例如从1000行的文件中返回101-120行.
我不想使用,seek因为我读过它很贵.
我有日志文件,我使用PIG处理成有意义的数据集.我一直在编写一个API来返回数据以供前端消费和显示.这些经过处理的数据集可以足够大,我不想在一个啜食中读出Hadoop中的整个文件,以节省线路时间和带宽.(比方说5 - 10MB)
目前我使用a BufferedReader来返回工作正常的小摘要文件
ArrayList lines = new ArrayList();
...
for (FileStatus item: items) {
// ignoring files like _SUCCESS
if(item.getPath().getName().startsWith("_")) {
continue;
}
in = fs.open(item.getPath());
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String line;
line = br.readLine();
while (line != null) {
line = line.replaceAll("(\\r|\\n)", "");
lines.add(line.split("\t"));
line = br.readLine();
}
}
Run Code Online (Sandbox Code Playgroud)
我在网上搜索了很多和Stack一样,但还没找到我需要的东西.
也许这完全是错误的做法,我需要一套完全独立的代码和不同的功能来管理它.对任何建议开放.
谢谢!
正如基于以下讨论的研究所补充的那样: Hadoop过程如何记录跨越块边界的记录? Hadoop FileSplit阅读
有没有办法接收Stream<String> stream了的BufferedReader reader,使得每个字符串stream代表一行reader与该附加条件stream直接提供(之前reader读到的一切)?我想处理stream并行数据以获取它们reader以节省时间.
编辑:我想处理与阅读并行的数据.我不想并行处理不同的行.它们应该按顺序处理.
让我们举例说明我希望如何节省时间.假设我们reader将向我们展示100行.读取一行需要2 ms,处理1 ms需要1 ms.如果我先读取所有行然后处理它们,将需要300毫秒.我想要做的是:一旦读取一行,我想处理它并且并行读取下一行.总时间将为201毫秒.
我不喜欢的东西BufferedReader.lines():据我所知,当我想要处理这些线时,阅读开始了.我们假设我已经完成了reader但必须先进行预计算才能处理第一行.假设它们花费30毫秒.在上面的例子中,总时间将是231毫秒或301毫秒使用reader.lines()(你能告诉我哪些时间是正确的吗?).但是有可能在201毫秒内完成工作,因为预计算可以与读取前15行并行完成.
bufferedreader ×10
java ×10
inputstream ×2
io ×2
sockets ×2
file ×1
file-io ×1
hadoop ×1
iteration ×1
java-8 ×1
java-stream ×1
offset ×1
performance ×1
readline ×1
ready ×1
stream ×1