客户端向服务器发送文件,点击发送按钮后,希望按如下顺序执行:
1、在文本区中添加文本“开始传输文件......\n”
2、根据传输的字节计算完成进度,并实时更新进度条
3、向文本中添加文本“传输完成,总计耗时:.....”
但是实际执行结果为,传输期间进度条没有实时更新,当文件全部传输完成后,一次性添加了1和3的文本,进度条直接从0变成了100。
这是为什么呢,请大家指点一二。下面是按钮触发的函数。
public void actionPerformed(ActionEvent e) {
fileInfo.append("开始传输文件......\n");//fileInfo是文本区
long startTime = System.currentTimeMillis();//记录当前时间
FileInputStream fileInputStream = null;//创建文件输入流
try {
fileInputStream = new FileInputStream(file);
dataOutputStream = new DataOutputStream(socket.getOutputStream());//初始化socket的输出流
String fileName = file.getName();
dataOutputStream.writeUTF(fileName);//向IO流写入文件名称
long fileLength = file.length();
dataOutputStream.writeLong(fileLength);//向IO流写入文件大小
byte[] toSend = new byte[1024 * 1024];//字节缓冲区,每次写入1MB大小
long total = 0;//累计写入字节数
int i = -1;//单次写入字节数,初始值-1
dataInputStream = new DataInputStream(fileInputStream);
while ((i = dataInputStream.read(toSend)) != -1) {//循环向IO流写入字节数组
dataOutputStream.write(toSend, 0, i);//写入实际读取到的字节数
dataOutputStream.flush();
total += i;//更新累计读取到的字节数
double rate = (double) total / fileLength;//生成读取进度
progressBar.setValue((int) (rate * 100));//动态更新进度条
progressBar.setString(numFormat(rate));//动态更新进度条的字符
}
long endTime = System.currentTimeMillis();//记录结束时间
fileInfo.append("传输完成,总计耗时:" + (endTime - startTime) / 1000 + "秒\n");//向文本区添加时间记录
} catch (IOException ex) {
ex.printStackTrace();
} finally {
if (fileInputStream != null) {//释放文件资源
try {
fileInputStream.close();
fileInfo.append("文件资源已释放!\n");
} catch (IOException ex) {
ex.printStackTrace();
}
}
try {
socket.shutdownOutput();//禁用socket输入流,结束本次传输
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
JAVA代码方法执行先后顺序出错!急!
我不知道你说的先执行后执行是什么意思,你如果是想在第一个方法完全执行完后再执行第二个方法你可以,你可以把第二个方法中的代码写在第一个方法中,或者你有办法可以考虑去同步ActionEvent对象,如果ActionEvent本省就是同步的话(这个要查资料),你可以这样:private void musicActionPerformed( ActionEve...
代码执行顺序是从上往下吗
是的,代码的执行顺序通常是从上往下,逐行执行的。在大多数编程语言中,包括Python、Java、C++等,代码的执行顺序遵循从上到下的原则。也就是说,程序从第一行代码开始执行,然后逐行向下执行,直到程序的最后一行。这种执行方式也被称为顺序执行。这种执行顺序规则使得程序员可以预测和理解代码的行为。例...
代码的执行顺序是
Java代码的执行顺序通常遵循以下规则:1. 按照从上到下,从左到右的顺序执行。2. 在if表达式中,若存在多个表达式,并且这些表达式之间使用&&(逻辑与)连接,则如果第一个表达式不满足条件,那么第二个及后续的表达式将不会被执行。3. 类似地,如果多个表达式之间使用||(逻辑或)连接,且第一个表达式...
java中同一层次的语句是按先后顺序执行还是同时执行呢?
\\x0d\\x0a1、执行顺序如下:\\x0d\\x0a初始化->条件表达式->语句->增量->条件表示式->语句-增量->...->条件表达式。\\x0d\\x0a在执行的时候,初始化语句只执行一次,后续按照条件表达式进行判断,如果符合条件,则执行[语句],然后执行增量。再根据条件表示式进行判断,重复上面过程。\\x0d\\x0a...
java中的for循环嵌套语句怎么执行啊 比如嵌套4个 ?
先从上到下执行,到最内层后,从内到外执行。举个例子:for(int i=0;i<10;i++) 第一层 for(int j=0;j<11;j++) 第二层 for(int k=0;k<12;k++) 第三层 for(int m=0;m<13;m++) 第四层 a++;执行语句就只有一句a++,然后我们来看执行顺序:先从上到下执行for循环...
关于循环的执行顺序问题(java)
在Java里 程序的执行顺序 和串行程序 和并行程序有关 串行程序(单线程程序)执行顺序是调用代码块的从上到下执行 循环{} 是按照循环的次数依次在代码块内由上而下的执行。并行程序(多线程并发)CPU\/JVM 存在指令重排序的优化,即会对互不影响上下文的程序进行重排序操作,这时候顺序就指不定了,...
Java编译执行顺序
1、class X 中Y先执行,输出Y 2、X的构造方法执行 ,输出X 3、Z 的实例化Y执行,输出Y 4、Z的构造方法执行 ,输出Z 成员变量先于构造方法,子类实例化时会先调用 父类的构造方法 其实,你给Y加一个 Y(String index){ System.out.println("Y "+index);} 再改成 Y b= new Y("b"...
java里,a方法执行时,b方法不能执行,怎么控制?
你说的就是线程同步问题,只要用synchronized来修饰a和b方法就行了。例如:public class test{ public synchronized void a(){} public synchronized void b(){} } 也可以用synchronized来锁住代码块就像3楼那样。
java 程序中怎么保证多线程的运行安全?
有序性:程序执行的顺序按照代码的先后顺序执行。(处理器可能会对指令进行 重排序)出现线程安全问题的原因:线程切换带来的原子性问题 缓存导致的可见性问题 编译优化带来的有序性问题 解决办法:JDK Atomic开头的原子类、synchronized、LOCK,可以解决原子性问题 synchronized、volatile、LOCK,可以解决可见性...
Java中出现异常如何进行处理,其中代码执行的步骤是什么
如果想在当前类处理,则try catch这个异常 若是throw的话,则发现异常直接抛回给上层,执行顺序是:抛出异常、上层处理 若try catch的话 try{ new Exception();}catch(Exception ex){ 这里处理异常 } 如果有finally块的话 执行顺序为: try、catch、finally finally无论是否有异常都将执行。