我有一个执行一些 IO 的方法,我想限制对这个方法的调用(每秒),以避免后端获得它无法处理的并发请求的爆发。
如果要求没有“每秒”,我可以只使用一个堆栈(基本上只是一个计数器)并offer()在开始请求时和poll()完成时使用。对于“每秒”要求,我需要以某种方式清除堆栈上比给定时间流逝更旧的插槽。
我该如何正确地做到这一点?显然,该结构应该是线程安全的。
感谢您的时间!
我在 Spring Batch 项目的 beans 定义文件中配置了以下编写器:
<bean id="writer" class="org.springframework.batch.item.file.FlatFileItemWriter">
<property name="resource" value="file:/path/to/somefile"/>
<property name="lineAggregator">
<bean class="MyCustomLineAggregator"/>
</property>
</bean>
Run Code Online (Sandbox Code Playgroud)
现在,我不想写入 /path/to/somefile,而是希望将输出发送到 stdout,原因是我想通过命令行启动器启动此作业,并将输出通过管道传输到另一个 unix 程序。
我尝试将资源属性设置为“file:/dev/stdout”,但随后出现异常: org.springframework.batch.item.ItemStreamException: Unable to create file: [/dev/stdout]
我试图看看是否有一个开箱即用的资源可以处理这个问题,但我有点不知道哪个资源可以完成这项工作......
感谢您的帮助。
编辑:以下是我根据您的建议提出的解决方案:
import java.util.List;
import org.springframework.batch.item.ItemWriter;
import org.springframework.batch.item.file.transform.LineAggregator;
public class StdoutWriter<T> implements ItemWriter<T> {
LineAggregator<T> lineAggregator;
public void setLineAggregator(LineAggregator<T> lineAggregator) {
this.lineAggregator = lineAggregator;
}
@Override
public void write(List<? extends T> items) throws Exception {
for (T item : items) {
System.out.println(lineAggregator.aggregate(item));
}
}
}
Run Code Online (Sandbox Code Playgroud) 快速设计问题:我需要在我的游戏引擎架构中实现客户端-服务器网络之间的一种通信形式,以便在彼此之间发送事件。
我选择创建事件对象,因此,我想知道序列化这些对象并通过简单套接字网络通过对象流传递它们的效率如何?
也就是说,与创建对象的字符串表示、通过字符流发送字符串以及解析字符串客户端相比,效率如何?
事件将在每个游戏循环中发送,如果不是更多的话;但事件对象本身只是一些 Java 原语的简单包装器。
感谢您的洞察力!
(tl;dr - 网络上的对象流是否有效?)
问题类似于以下两个问题.
但我仍然无法完全理解它.
到目前为止,我认为以下代码中的read()方法将因空文件'test.txt'而阻塞.
FileInputStream fis = new FileInputStream("c:/test.txt");
System.out.println(fis.read());
System.out.println("to the end");
Run Code Online (Sandbox Code Playgroud)
实际上它会打印-1,我想知道为什么.
javadoc说如果还没有输入,则此方法会阻塞.
什么" 没有输入可用 "是什么意思?
谢谢.
我正在尝试执行以下操作
我正在使用我的 Java 应用程序打电话给另一个人(已经完成并且工作正常)。
然后我正在播放录音,例如“请按 1 继续用英语”(已经完成并且工作正常)。
现在我想检测那个人按 1,根据我在谷歌搜索中的研究,我知道这可以使用 DTMF。如果这个人按 1,我想根据我的情况执行操作。
我的问题是如何在 java (J2SE) 中使用 DTMF 检测该数字。我正在使用中兴 USB 加密狗拨打电话。拨号、挂断等控制是通过AT指令+Java IO实现的。
这是我的示例代码,但它没有给出正确的拨号号码及其每次循环。
public class zxczczz extends javax.swing.JFrame {
/**
* Creates new form zxczczz
*/
public zxczczz() {
initComponents();
}
float[] lowFreq = new float[]{697.0F, 770.0F, 852.0F, 941.0F};
float[] highFreq = new float[]{1209.0F, 1336.0F, 1477.0F, 1633.0F};
float[] dtmfTones = new float[]{697.0F, 770.0F, 852.0F, 941.0F, 1209.0F, 1336.0F, 1477.0F, 1633.0F};
int dtmfBoard[][] = {{1, 2, 3, 12}, {4, 5, 6, 13}, {7, 8, …Run Code Online (Sandbox Code Playgroud) 该java.io.File的文件说,有关它的构造函数下面的话更是把pathname:
public File(String pathname)通过将给定的路径名字符串转换为抽象路径名来创建一个新的 File 实例。如果给定的字符串是空字符串,则结果是空的抽象路径名。
但是如果pathname指向一个已经存在的文件呢?
File file = new File(PATH_TO_AN_EXISTING_FILE);
Run Code Online (Sandbox Code Playgroud)
上面的file实例是代表一个新文件(删除现有文件?)还是代表现有文件?
我有一个文件阅读器,它将文件的行作为Object[]. 我正在使用该lines方法。使用起来会更快吗readAllLines?我不将该流用于其他任何用途,但我想currentBookData成为String[]or Object[]。
package input;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.stream.Stream;
public class ReadFile {
public static Object[] currentBookData;
public static void getBookData(String path) throws IOException {
try (Stream<String> stream = Files.lines(Paths.get(path), Charset.defaultCharset())) {
currentBookData = stream.toArray();
}
catch (IOException ex) {
System.out.println(ex.getMessage());
}
}
}
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) 我有一个在 java JDK 1.7 下运行的批处理。它在带有 RHEL、2.6.18-308.el5 #1 SMP 的系统上运行。
此过程从数据库中获取元数据对象列表。它从这个元数据中提取文件的路径。该文件可能实际存在,也可能不存在。
该进程使用 ExecutorService ( Executors.newFixedThreadPool()) 来启动多个线程。每个线程都运行一个 Callable,它启动一个进程,该进程读取该文件并在该输入文件存在时写入另一个文件(并记录结果),如果该文件不存在则不执行任何操作(记录该结果除外)。
我发现行为是不确定的。尽管每个文件的实际存在始终不变,但运行此过程并不会给出一致的结果。它通常会给出正确的结果,但偶尔会发现一些确实存在的文件不存在。如果我再次运行相同的过程,它会发现它之前所说的文件不存在。
为什么会发生这种情况,是否有更可靠的替代方法?在其他线程尝试读取目录时在多线程进程中写入文件是否错误?较小的线程池会有所帮助(目前为 30)吗?
更新: 这是在这种情况下工作线程调用的 unix 进程的实际代码:
public int convertOutputFile(String inputFile, String outputFile)
throws IOException
{
List<String> args = new LinkedList<String>();
args.add("sox");
args.add(inputFile);
args.add(outputFile);
args.addAll(2, this.outputArguments);
args.addAll(1, this.inputArguments);
long pStart = System.currentTimeMillis();
int status = -1;
Process soxProcess = new ProcessBuilder(args).start();
try {
// if we don't wait for the process to complete, player won't
// find the converted file.
status = soxProcess.waitFor(); …Run Code Online (Sandbox Code Playgroud) 最初我有以下代码:
try (var output = new ByteArrayOutputStream();
var printer = new CSVPrinter(new OutputStreamWriter(output), CSVFormat.DEFAULT)) {
printer.printRecord(EMAIL);
for (MyBean mb : items) {
printer.printRecord(mb.getEmail());
}
externalHttpCall(output.toByteArray());
}
Run Code Online (Sandbox Code Playgroud)
在这里我发现有时字节数组没有完全写入。
我知道这是因为在externalHttpCall调用过程中没有刷新流。
为了修复它,我写了以下内容:
try (var output = new ByteArrayOutputStream();
var printer = new CSVPrinter(new OutputStreamWriter(output), CSVFormat.DEFAULT)) {
printer.printRecord(EMAIL);
for (MyBean mb : items) {
printer.printRecord(mb.getEmail());
}
printer.flush();
log.info("Printer was flushed");
externalHttpCall(output.toByteArray());
}
Run Code Online (Sandbox Code Playgroud)
它解决了这个问题,但在这里我迷失了一个想法,即仅在externalHttpCall. 所以我想出了以下解决方案:
externalHttpCall(convertToByteArray(items);
public byte[] convertToByteArray(List<MyBean> items){
try (var output = new …Run Code Online (Sandbox Code Playgroud) java ×10
java-io ×10
at-command ×1
blocking ×1
dtmf ×1
file ×1
inputstream ×1
io ×1
iostream ×1
jdk1.7 ×1
networking ×1
nio ×1
spring ×1
spring-batch ×1