我有一个Socket,我通过BufferedReaders和BufferedWriters阅读和写入.我不确定哪些操作可以通过单独的线程完成.我猜想同时从两个不同的线程写入套接字是个坏主意.与从两个不同的线程同时读取套接字相同.在另一个线程上写入时在一个线程上读取怎么样?
我问,因为我想在读取时长时间阻塞一个线程,因为它等待更多数据,但在这个等待期间我也偶尔会在套接字上发送数据.我不清楚这是否是线程安全的,或者我是否应该在写入之前取消读取(这会很烦人).
这段代码正在创建BufferedReader和InputStreamReader导致的内存泄漏问题,我认为可能会发生一些异常.我该怎么改变它?
try{
URL url = new URL(sMyUrl);
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
while ((str = in.readLine()) != null) {
jsonString += str;
}
in.close();
}catch(Exception e){
}
Run Code Online (Sandbox Code Playgroud) 所以我在这里有一些代码,我不确定如果reader.close()方法抛出异常,它会如何反应.
public void someMethod(String s) throws IOException{
BufferedReader reader = Files.newBufferedReader(filePath,cs);
listRWLock.readLock().lock();
try{
//miscellaneous code involving reading
}finally{
reader.close()
listRWLock.readLock().unlock()
}
}
Run Code Online (Sandbox Code Playgroud)
ListRWLock是一个ReentrantReadWriteLock.如果reader.close()方法抛出异常,那么它之后的语句是否会无法执行?我已经尝试搜索这个主题了,虽然我已经得到了一些关于在return语句中最终执行的东西,但是我还没有设法找到如果在finally块中抛出异常会发生什么的细节.
提前致谢.
我正在读取一个50G文件,其中包含由换行符分隔的数百万行.目前我使用以下语法来读取文件
String line = null;
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("FileName")));
while ((line = br.readLine()) != null)
{
// Processing each line here
// All processing is done in memory. No IO required here.
}
Run Code Online (Sandbox Code Playgroud)
由于文件太大,需要2小时才能处理整个文件.我可以改进从硬盘读取文件,以便IO(读取)操作花费最少的时间.我的代码限制是我必须处理每一行的顺序.
我有三个问题.
为了解释,我正在审查某人的代码,并注意到BufferedReader有时候没有关闭.通常,Eclipse会发出警告,这是一个潜在的内存泄漏(我修复了它).但是,在Callable内部类中,没有警告.
class outerClass {
...
public void someMethod() {
Future<Integer> future = outputThreadPool.submit(new innerClass(this.myProcess.getInputStream(), threadName));
...
}
class innerClass implements Callable<Integer> {
private final InputStream stream;
private final String prepend;
innerClass(InputStream stream, String prepend) {
this.stream = stream;
this.prepend = prepend;
}
@Override
public Integer call() {
BufferedReader stdOut = new BufferedReader(new InputStreamReader(stream));
String output = null;
try {
while ((output = stdOut.readLine()) != null) {
log.info("[" + prepend + "] " + output);
}
} catch …Run Code Online (Sandbox Code Playgroud) 我写了一个简单的服务器和客户端示例如下.
客户:
获取输入流并从流中读取.此时获得例外
public class DateServer {
public static void main(String[] args) throws InterruptedException {
ServerSocket serverSocket = null;
Socket client = null;
try {
serverSocket = new ServerSocket(6013);
while (true) {
client = serverSocket.accept();
OutputStream outputStream = client.getOutputStream();
InputStream inputStream = client.getInputStream();
System.out.println("" + outputStream + "-" + inputStream);
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(inputStream));
String line = null;
while ((line = bufferedReader.readLine()) != null) {
System.out
.println("Message recieved from client ::" + line);
}
PrintWriter …Run Code Online (Sandbox Code Playgroud)我遇到了使用line()方法计算行号的问题BufferedReader.以下是test.txt文件内容.
1 Career
2 Filmography
3 Awards
4 References
5 External
Run Code Online (Sandbox Code Playgroud)
以下是两次计算行号的源代码.
BufferedReader br=new BufferedReader(new FileReader(new File("test.txt")));
long lineNo=br.lines().count();
long lineNo2=br.lines().count();
System.out.println(lineNo); // 5
System.out.println(lineNo2);// 0
Run Code Online (Sandbox Code Playgroud)
在这里,我有疑问为什么第二行lineNo2打印0而不是5?提前致谢.
我无法真正理解Java中的类FileReader和目的是什么BufferedReader.
在docs.oracle,建议将一个缓冲读取器包装在一个FileReader对象周围,因为FileReader直接使用它是没有效率的.成本或间接费用来自哪里?
假设我有一个文本文件,我想用这些类读入我的java程序:
我使用FileReader和BufferedReader
FileReader fileReader = new FileReader(new File("text.txt)"); // probably correct???
BufferedReader bufferedReader = new BufferedReader(fileReader);
Run Code Online (Sandbox Code Playgroud)
1)FileReader这里对象的任务是什么?是否负责通过操作系统向文件发出I/O请求,然后读取字节?这有什么代价?FileReader提出几个I/O请求是真的吗?或者是FileReader对象必须逐字符地将字节转换为字符的成本?
2)BufferedReader-object的任务 - 引用上面的最后一句话. - BufferedReader对象的角色是简单地缓冲传入字节的数组,然后将它们转换为字符?
非常感谢答案
编辑:首先感谢收到的答案.但我应该提到它正是我研究过的文档.叫我愚蠢或什么 - 但"每个阅读请求"是什么意思.什么时候每个读取请求?多常?
通常,由Reader构成的每个读取请求都会导致相应的读取请求由基础字符或字节流构成.因此,建议将BufferedReader包装在任何read()操作可能代价高昂的Reader上,例如FileReaders和InputStreamReaders.例如,
这主要是为什么推出这个问题 - 听起来FileReader会导致很多I/O请求,这会减慢错误.
我最近在我的网站上添加了SSL,可以通过https访问.现在,当我的java应用程序尝试向我的网站发出请求并使用缓冲读取器从中读取它时,它会生成此堆栈跟踪
我没有使用自签名证书,证书来自Namecheap,他使用COMODO SSL作为CA来签署我的证书.即时通讯使用java 8
javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)
at sun.security.ssl.Handshaker.activate(Handshaker.java:503)
at sun.security.ssl.SSLSocketImpl.kickstartHandshake(SSLSocketImpl.java:1482)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1351)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1403)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1387)
at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:559)
Run Code Online (Sandbox Code Playgroud)
我的代码非常基本,只是尝试使用缓冲读取器在我的网站上阅读页面
private void populateDataList() {
try {
URL url = new URL("https://myURL.com/Data/Data.txt");
URLConnection con = url.openConnection();
con.setRequestProperty("Connection", "close");
con.setDoInput(true);
con.setUseCaches(false);
BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
String line;
int i = 0;
while((line = in.readLine()) != null) {
this.url.add(i, line);
i++;
}
} catch (Exception e) {
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试将我的SSL证书添加到JVM的密钥库中,我甚至尝试使用此代码接受每个证书(这证明了我知道的SSL的目的)
private …Run Code Online (Sandbox Code Playgroud) 我是第一次加入Hackerrank。只是为了一些练习目的。然后,我找到了这条线
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(System.getenv("OUTPUT_PATH")));
Run Code Online (Sandbox Code Playgroud)
并且很困惑什么是"OUTPUT_PATH". 因为代码被复制到我的 IDE (Eclipse) 中,所以我阅读了文档,但没有一个适合的保留值。他们都扔了NPE。
System.getenv("..")在我的情况下,正确的参数值是多少?
如果您需要完整代码:
import java.io.*;
import java.math.*;
import java.text.*;
import java.util.*;
import java.util.regex.*;
import javax.swing.JOptionPane;
public class Solution {
/*
* Complete the simpleArraySum function below.
*/
static int simpleArraySum(int[] ar) {
return 2;
}
private static final Scanner scanner = new Scanner(System.in);
public static void main(String[] args) throws IOException {
//name ? This is the name of the environment variable.
BufferedWriter bufferedWriter = …Run Code Online (Sandbox Code Playgroud)