我有一个大文件(英文维基百科文章只有数据库作为XML文件).我正在使用一次读一个字符BufferedReader.伪代码是:
file = BufferedReader...
while (file.ready())
character = file.read()
Run Code Online (Sandbox Code Playgroud)
这实际上有效吗?或者ready只是false在等待硬盘返回数据时返回,而不是EOF在达到数据时实际返回?我试图使用,if (file.read() == -1)但似乎遇到了一个我无法找到的无限循环.
我只是想知道它是否正在阅读整个文件,因为我的统计数据显示已经阅读了444,380个维基百科页面,但我认为还有更多的文章.
我正在编写一个客户端应用程序,它将通过tcp/ip接收连续的数据流.我遇到的问题是缓冲的阅读器对象没有接收到任何数据,并且挂在readline方法上.
服务器的工作方式是连接到它,然后发送身份验证信息以接收数据.我的代码的要点如下
socket = new Socket(strHost, port);
authenticate();
inStream = new BufferedReader(new InputStreamReader(socket.getInputStream()));
process(inStream);
authenticate()
{
PrintWriter pwriter = new PrintWriter(socket.getOutputStream(), true);
pwriter.println(authString);
}
process(BufferedReader bufferedReader)
{
while((line = bufferedReader.readLine()) != null)
dostuff
}
Run Code Online (Sandbox Code Playgroud)
我创建了一个示例服务器应用程序,它以一种方式发送数据(我认为)服务器正在发送数据并且它连接,并接收和处理数据.我可以在我的应用程序中正常连接到服务器.我也可以telnet到服务器并写入身份验证字符串并使用telnet接收大量数据.但是我的应用程序只是挂在readLine与服务器,我不明白为什么.
进入的数据(通过telnet atleast)看起来像是以下的连续流:
data;data;data;data;data
data;data;data;data;data
Run Code Online (Sandbox Code Playgroud)
为什么我的应用程序挂在readline上,我没有正确输出身份验证行?我没有收到任何错误......
编辑 我的示例服务器代码(正常工作)...再次这只是模仿我认为真实服务器正在运行的方式,但我可以连接到我的应用程序中只是没有从真实服务器接收数据.
public static void main(String[] args) throws IOException
{
ServerSocket serverSocket = null;
try
{
serverSocket = new ServerSocket(1987);
}
catch (IOException e)
{
System.out.println("Couldn't listen on port: 1987");
System.exit(-1);
}
Socket clientSocket = null;
try
{ …Run Code Online (Sandbox Code Playgroud) 我有一个缓冲读取器等待输入但由于某种原因它不等待第二次读取并继续打印我的第三个print语句.
码:
BufferedReader inFromUser=new BufferedReader(new InputStreamReader(System.in));
char letter,xVal;
int yVal;
System.out.println("Please enter a letter for your word.(a-z)");
letter=(char)inFromUser.read();
System.out.println("Please enter a X location for this piece.(A-J)");
xVal=(char)inFromUser.read();
System.out.println("Please enter a Y location for this piece.(0-9)");
yVal=inFromUser.read();
Run Code Online (Sandbox Code Playgroud)
示例执行如下:请输入您的单词的字母.//在这里等待输入
一个
请输入此作品的X位置.//不等在这里???
请输入此作品的Y位置.
我正在阅读一个格式化的文本文件
word
definiton
word
definition
definition
word
definition
Run Code Online (Sandbox Code Playgroud)
所以我需要继续尝试我是否在定义或不基于我何时达到这些emtpy行.事情就是,BufferedReader丢弃\n字符,并以某种方式比较那条空行String ""并没有像我想象的那样注册.我怎么能这样做呢.
假设我有一个名为的文本文件:data.txt(包含2000行)
如何读取给定的特定行:500-1500然后1500-2000并显示特定行的输出?
此代码将读取整个文件(2000行)
public static String getContents(File aFile) {
StringBuffer contents = new StringBuffer();
try {
BufferedReader input = new BufferedReader(new FileReader(aFile));
try {
String line = null;
while (( line = input.readLine()) != null){
contents.append(line);
contents.append(System.getProperty("line.separator"));
}
}
finally {
input.close();
}
}
catch (IOException ex){
ex.printStackTrace();
}
return contents.toString();
}
Run Code Online (Sandbox Code Playgroud)
如何修改上面的代码以读取特定的行?
我正在尝试使用Java读取一个非常大的文件.那个大文件会有这样的数据,这意味着每一行都有一个用户ID.
149905320
1165665384
66969324
886633368
1145241312
286585320
1008665352
Run Code Online (Sandbox Code Playgroud)
在那个大文件中,将有大约3000万用户ID.现在我试图从那个大文件中一个一个地读取所有用户ID.意味着每个用户ID只能从该大文件中选择一次.例如,如果我有30万个用户ID,那么它应该使用多线程代码只打印一次3000万用户ID.
下面是我的代码,它是一个运行10个线程的多线程代码但是使用下面的程序,我无法确保每个用户ID只被选中一次.
public class ReadingFile {
public static void main(String[] args) {
// create thread pool with given size
ExecutorService service = Executors.newFixedThreadPool(10);
for (int i = 0; i < 10; i++) {
service.submit(new FileTask());
}
}
}
class FileTask implements Runnable {
@Override
public void run() {
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader("D:/abc.txt"));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
//do things with …Run Code Online (Sandbox Code Playgroud) 关于BufferedReader如何工作的非常基本的问题。给定字符串/短语,我想从其中包含很多文本的文件中查找并打印它。
我在Java中使用BufferedReader对此主题进行了一些研究,这是最接近的结果。虽然不能完全解决我的问题。
因此,有了这些信息,为什么以下代码会终止?
public class MainApp {
String line = null;
String phrase = "eye";
try {
File file = new File("text.txt");
FileReader fr = new FileReader(file);
BufferedReader br = new BufferedReader(fr);
while((line = br.readLine()) != null) {
if (line.equals(phrase) {
System.out.println(line);
}
}
br.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我对这个区块应如何运作的了解:
为什么我认为它可能 不会 工作:
readlines不会作为字符串存储在BufferedReader中(因此无法进行比较)
错误的逻辑(很可能是if语句)
为了简单起见,让我们假设“ text.txt”充满了非常长的传说ipsum,并且在其中间的某个地方加上了一个“ eye”字。
问题到底在哪里?(如果可能的话,请不要提供完整的代码解决方案,为了练习,我很乐意亲自完成编码工作)。
我有一个叫做的类User和一个名为的文件Users.csv,如下所示:
用户类:
public class User
{
private String name;
private String rg;
private String type;
public String getName()
{
return name;
}
public String getRg()
{
return rg;
}
public String getType()
{
return type;
}
public void setName(String n)
{
name = n;
}
public void setRg(String r)
{
rg = r;
}
public void setType(String t)
{
type = t;
}
}
Run Code Online (Sandbox Code Playgroud)
Users.csv:
a,b,c
d,e,f
as,d,cf
Run Code Online (Sandbox Code Playgroud)
另外,我有一个名为的类test,它实现了一个方法:
考试类:
public class test
{ …Run Code Online (Sandbox Code Playgroud) 我想反击文件的行,在第二遍我想采取每一行并操纵它.它没有编译错误,但它不能进入第二个while ((line = br.readLine()) != null).是否有不同的方法来获取文件的行(电影)并存储在数组中?
BufferedReader br = null;
try { // try to read the file
br = new BufferedReader(new FileReader("movies.txt"));
String line;
int numberOfMovies = 0;
while ((line = br.readLine()) != null) {
numberOfMovies++;
}
Movie[] movies = new Movie[numberOfMovies]; // store in a Movie
// array every movie of
// the file
String title = "";
int id = 0;
int likes = 0;
int icounter = 0; // count to create new movie …Run Code Online (Sandbox Code Playgroud) 我正在学习Android开发(我是一般的编程初学者)并学习HTTP网络,并在课程中看到了这段代码:
private String readFromStream(InputStream inputStream) throws IOException {
StringBuilder output = new StringBuilder();
if (inputStream != null) {
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, Charset.forName("UTF-8"));
BufferedReader reader = new BufferedReader(inputStreamReader);
String line = reader.readLine();
while (line != null) {
output.append(line);
line = reader.readLine();
}
}
return output.toString();
}
Run Code Online (Sandbox Code Playgroud)
我不完全理解InputStream,InputStreamReader和BufferedReader的作用.所有这些都有一个read()方法,并且在BufferedReader的情况下也有readLine().为什么我不能只使用InputStream或只添加InputStreamReader?为什么我需要添加BufferedReader?我知道这与效率有关,但我不明白如何.
我一直在研究,BufferedReader的文档试图解释这个,但我仍然不知道谁在做什么:
通常,由Reader构成的每个读取请求都会导致相应的读取请求由基础字符或字节流构成.因此,建议将BufferedReader包装在任何read()操作可能代价高昂的Reader上,例如FileReaders和InputStreamReaders.例如,
BufferedReader in = new BufferedReader(new FileReader("foo.in"));将缓冲指定文件的输入.如果没有缓冲,read()或readLine()的每次调用都可能导致从文件中读取字节,转换为字符,然后返回,这可能是非常低效的.
所以,据我所知,InputStream只能读取一个字节,InputStreamReader只能读取一个字符,而BufferedReader只能读取整行,并且它还可以解决效率问题,这是我无法得到的.我想更好地了解谁在做什么,以便理解为什么我需要他们所有这三个以及没有他们之一的差别.
我在这里和网上的其他地方进行了很多研究,似乎没有找到任何关于我可以理解的解释,几乎所有教程都只重复文档信息.以下是一些相关的问题,可能会开始解释这一点,但不要深入解决我的困惑:Q1,Q2,Q3,Q4.我认为这可能与最后一个问题关于系统调用和返回的解释有关.但我想了解这一切的含义.
可能是BufferedReader的readLine()调用了InputStreamReader的read()方法,而该方法又调用了InputStream的read()方法?并且InputStream返回转换为int的字节,一次返回一个字节,InputStreamReader读取足够的这些字符以生成单个字符并将其转换为int并一次返回一个字符,并且BufferedReader读取足够的这些字符用整数表示整数?并将整行作为String返回,只返回一次而不是几次?我不知道,我只是想弄清楚事情是如何运作的.
非常感谢提前!
bufferedreader ×10
java ×10
file ×3
inputstream ×2
android ×1
arraylist ×1
csv ×1
file-read ×1
filereader ×1
io ×1
java-io ×1
sockets ×1
whitespace ×1