const express = require('express');
const fs = require('fs');
const path = require('path');
const app = express();
app.get('/', function(req, res) {
res.sendFile(path.join(__dirname + '/index.html'));
})
app.get('/audio', function(req, res) {
const path = 'sample.mp3';
const stat = fs.statSync(path);
const fileSize = stat.size;
const range = req.headers.range;
if (range) {
const parts = range.replace(/bytes=/, '').split('-');
const start = parseInt(parts[0], 10);
const end = parts[1] ? parseInt(parts[1], 10) : fileSize - 1;
const chunksize = (end-start) + 1;
const file = fs.createReadStream(path, {start, end});
const head = {
'Content-Range': `bytes ${start}-${end}/${fileSize}`,
'Accept-Ranges': 'bytes',
'Content-Length': chunksize,
'Content-Type': 'audio/mpeg',
};
res.writeHead(206, head);
file.pipe(res);
} else {
const head = {
'Content-Length': fileSize,
'Content-Type': 'audio/mpeg',
};
res.writeHead(200, head);
fs.createReadStream(path).pipe(res);
}
});
app.listen(8000, function () {
console.log('Listening on port 8000!');
});
<html>
<head>
<title>Example</title>
</head>
<body>
<audio id="audioPlayer" controls>
<source src="http://localhost:8000/audio" type="audio/mpeg">
</audio>
</body>
</html>
std::string
, но судя по заголовку и тексту разговор о C. Если всё же C и вам не хватает тех функций работы со строками, которые перечислены в заголовочном файле string.h, то можно посмотреть на GLib например. Test.this.outerString
класса innerTest
, что естественно невозможно. А внутри любого метода проблем с доступом у вас не возникнетclass innerTest {
void someMethod() {
Test.this.outerString = "ПОК ПОК ПОК";
// или даже проще
outerString = "ПОК ПОК ПОК";
}
}
eventLoop.schedule(() -> {
ConsumerRecords<String, String> records = consumer.poll(Duration.ZERO);
// Какие-либо действия
}, 100, TimeUnit.MILLISECONDS);
class MessageListener implements Runnable {
private final ChannelGroup group;
private volatile boolean run = true;
public MessageListener(ChannelGroup group) {
this.group = group;
}
public void run() {
while(run) {
ConsumerRecords<String, String> records = notificationConsumer.poll(Duration.ofSecond(5));
if (!records.isEmpty())
group.forEach(c -> c.pipeline().fireUserEventTriggered(new NewMsgEvent()));
}
}
public void stop() {
run = false;
}
}
class SomeHandler extends ChannelInboundHandlerAdapter {
@Override
public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
if(evt instanceof NewMsgEvent) {
ConsumerRecords<String, String> records = clientConsumer.poll(Duration.ZERO);
records.forEach(record -> {
ctx.write(Unpooled.wrappedBuffer(record.value().getBytes(StandardCharsets.UTF_8)));
});
ctx.flush();
}
else {
super.userEventTriggered(ctx, evt);
}
}
}
MessageListener
мог отправить событие только в один нужный конвейер или чтобы только нужный обработчик на событие отреагировал. StringBuilder
даёт преимущество только при множестве операций на изменение строки. Например при наращивании строки в цикле. Во всех остальных случаях StringBuilder
медленнее и требует больше памяти. Кроме того, он не является потокобезопасным, в отличии от строк.public class Example {
public static String concat(String s1, String s2) {
return s1 + s2;
}
public static void main(String[] args) {
System.out.println(concat("Hello ", "World"));
}
}
javac Example.java
javap -c Example
public static java.lang.String concat(java.lang.String, java.lang.String);
Code:
0: new #2 // class java/lang/StringBuilder
3: dup
4: invokespecial #3 // Method java/lang/StringBuilder."<init>":()V
7: aload_0
8: invokevirtual #4 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
11: aload_1
12: invokevirtual #4 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
15: invokevirtual #5 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
18: areturn