Вот еще одно решение, которое, хотя и выглядит нелепо, но, я думаю, немного чище и его проще использовать в разных классах AM :: Base:
module FTTUtilities
module ActionMailer
module ClassMethods
def smtp_settings
dict = YAML.load_file(RAILS_ROOT + "/config/custom_mailers.yml")[self.name.underscore]
@custom_smtp_settings ||= HashWithIndifferentAccess.new(dict)
end
end
module InstanceMethods
def smtp_settings
self.class.smtp_settings
end
end
end
end
пример Mailer:
class CustomMailer < ActionMailer::Base
extend FTTUtilites::ActionMailer::ClassMethods
include FTTUtilites::ActionMailer::InstanceMethods
end
Тот факт, что вы используете буфер, не означает, что поток должен заполнить этот буфер. Другими словами, это должно быть нормально:
public static void copyStream(InputStream input, OutputStream output)
throws IOException
{
byte[] buffer = new byte[1024]; // Adjust if you want
int bytesRead;
while ((bytesRead = input.read(buffer)) != -1)
{
output.write(buffer, 0, bytesRead);
}
}
Это должно работать нормально - в основном вызов read
будет блокироваться до тех пор, пока не будут доступны некоторые данные, но он не будет ждать, пока все доступны для заполнения буфера.